const nums = [10, 22, 233, 323, 3222, 311, 22, 12];

// 高阶函数 filter/map/reduce

// 需求1：将小于100的数值取出 
// filter中的回调函数有一个要求：必须返回一个boolean值
// true  : 函数内部会自动将这次回调的n加入到一个新的数组进行返回
// false : 函数内部会自动将这次回调进行过滤 
let newNums = nums.filter(function (n)
{
  return n < 100;
})
console.log(newNums);

// 需求2：将刚刚过滤的数组中的数值*2后输出
// map函数的使用
// 将回调函数中返回的元素添加到一个新数组中
let new2Nums = newNums.map(function (n)
{
  return n * 2;
})
console.log(new2Nums);

// 需求3：将刚刚*2的数组进行累加输出
// reduce作用对数组中所有的内容进行汇总

// preValue 为上次回调函数的返回值
// 例如

// 1 : {preValue : 0, n : 20}
// 2 : {preValue : 20, n : 40}
// 3 : {preValue : 60, n : 80}
// 4 : {preValue : 140, n : 100}
let reduce_return = new2Nums.reduce(function (preValue, n)
{
  return preValue + n;
}, 0)

console.log(reduce_return);


// 链式调用
let total = nums.filter(function (n)
{
  return n < 100;
}).map(function (n)
{
  return n * 2;
}).reduce(function (preValue, n)
{
  return preValue + n;
}, 0);
console.log("总价为"+total);

// 一行代码完成 (箭头函数) ES6写法
let total2 = nums.filter(n => n < 100).map(n => n * 2).reduce((preValue, n) => preValue + n);
console.log(total2);
